/****************************************************************************
**
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation
**
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
**     the names of its contributors may be used to endorse or promote
**     products derived from this software without specific prior written
**     permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
** $QT_END_LICENSE$
**
****************************************************************************/
#include "batteryinfoprivate.h"
#include "batteryinfowrapper.h"

/*!
 * Ctor initializes the data members and add Active Object
 * to the Active Scheduler
 */
 BatteryInfoPrivate::BatteryInfoPrivate(BatteryInfoWrapper *wrapper)
 : CActive(CActive::EPriorityStandard), q_ptr(wrapper),
 iTelephony(NULL), iBatteryInfoV1Pckg(iBatteryInfoV1)
 {
    CActiveScheduler::Add(this);
 }

/*!
 * Gets the battey info and stores in iBatteryInfoV1Pckg
 */
 void BatteryInfoPrivate::RequestBatteryInfo()
 {
    ASSERT(!IsActive());
    int err = CreateCTelephony();
    if ( err )
        {
        emit (q_ptr->errorOccured(err));        
        }
    else
        {        
        iTelephony->GetBatteryInfo(iStatus, iBatteryInfoV1Pckg);
        SetActive();
        }
 }

/*!
 * Ensures that iTelephony instance exists before called.
 * @return error code
 * Creates CTelephony data member
 */
 int BatteryInfoPrivate::CreateCTelephony()
 {
    int err = 0;
    if( !iTelephony )
        {
        TRAP(err, iTelephony = CTelephony::NewL());
        }
    return err;
 }


/*!
 *  RunL executes in the response to the request complete - RequestBatteryInfo
 */
 void BatteryInfoPrivate::RunL()
 {
    CTelephony::TBatteryInfoV1 BatteryInfo = iBatteryInfoV1;

    if( iStatus == KErrNone ) {
        // Registering for change in the battery strength
        iTelephony->NotifyChange(iStatus, CTelephony::EBatteryInfoChange, iBatteryInfoV1Pckg );
        QString text = QString::number(iBatteryInfoV1.iChargeLevel);
        // Emitting the signal with the battery strength
        emit (q_ptr->batteryInfoUpdated(text));
    } else {
        // Checking the type of error
        CTelephony::TBatteryStatus batteryStatus = BatteryInfo.iStatus;
        switch (batteryStatus)
        {
            case CTelephony::EPowerStatusUnknown:
                emit (q_ptr->errorOccured(CTelephony::EPowerStatusUnknown));
                break;
            case CTelephony::EPoweredByBattery:
                emit (q_ptr->errorOccured(CTelephony::EPoweredByBattery));
                break;
            case CTelephony::EBatteryConnectedButExternallyPowered:
                emit (q_ptr->errorOccured(CTelephony::EBatteryConnectedButExternallyPowered));
                break;
            case CTelephony::ENoBatteryConnected:
                emit (q_ptr->errorOccured(CTelephony::ENoBatteryConnected));
                break;
            case CTelephony::EPowerFault:
                emit (q_ptr->errorOccured(CTelephony::EPowerFault));
                break;
            default:
                emit (q_ptr->errorOccured(iStatus.Int()));
        }
      }
}

/*!
 * Cancels asynchronous requests
 */
void BatteryInfoPrivate::DoCancel()
{
    // Cancels an outstanding asynchronous request.
    iTelephony->CancelAsync(CTelephony::EBatteryInfoChangeCancel);
}
